// 1. 类 : MyPromise
// 2. new 的时候 在构造中传递一个参数
// 3. 参数是一个回调
// 4. 回调里面是两个函数 成功的时候 调用第一个参数resolve  失败的时候调用第二个参数
// 5. resolve 之后 结果交给谁?
// 6. then方法 接收的就是 resolve执行后的结果

export default class MyPromise {
  constructor(fn) {
    //__ 内部变量 约定
    // 成功的状态
    this.__success__ = '';
    // 失败的状态
    this.__failed__ = '';
    // 成功的结果
    this.__success_res__ = null;
    // 失败的结果
    this.__failed_res__ = null;

    // 队列
    this.__waitList__ = [];

    fn(
      (...args) => {
        this.__success__ = 'SUCCESS';
        this.__success_res__ = args;
        // 所有的回调 执行
        this.__waitList__.forEach(element => element.fn1(...args));
      }//异步成功之后 调用的回调
      , (...args) => {
        this.__failed__ = 'FAILED';
        this.__failed_res__ = args;
        this.__waitList__.forEach(element => element.fn2(...args));
      } // 异步失败之后
    )
  }

  //fn1 成功之后执行的结果
  //fn2 失败之后执行的结果
  then(fn1, fn2) {
    //1. 放在同步环境执行
    //2. 放在异步环境中执行

    // 同步环境中
    if (this.__success__ === 'SUCCESS') {
      fn1(this.__success_res__)
    } else if (this.__failed__ === 'FAILED') {
      fn2(this.__failed_res__);
    } else {
      // 异步
      this.__waitList__.push({
        fn1, fn2
      })
    }
    return this;
  }
}
